package com.cly.config;

import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * 消息转换器
 *
 * @author by 春风能解释
 * <p>
 * 2024/10/10
 */
@Configuration
@RequiredArgsConstructor
public class MessageConverterConfiguration {

    /**
     * 配置fastjson消息转换器
     *
     * @return fastjsonHttpMessageConverter
     */
    @Bean
    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setCharset(StandardCharsets.UTF_8);
        fastJsonConfig.setReaderFeatures(
                // 字段如 vBtn  会被转为 VBtn  处理这样的问题
                JSONReader.Feature.SupportSmartMatch,
                JSONReader.Feature.FieldBased,
                // 初始化String字段为空字符串""
                JSONReader.Feature.InitStringFieldAsEmpty,
                // 对读取到的字符串值做trim处理
                JSONReader.Feature.TrimString);
        fastJsonConfig.setWriterFeatures(
                // 字段如 vBtn  会被转为 VBtn  处理这样的问题
                JSONWriter.Feature.FieldBased,
                // long 转 string 丢失精度问题
                JSONWriter.Feature.WriteBigDecimalAsPlain,
                // 保留map空的字段
                JSONWriter.Feature.WriteLongAsString,
                // 将List类型的null转成[]
                JSONWriter.Feature.WriteNullListAsEmpty,
                // 将String类型的null转成""
                JSONWriter.Feature.WriteNullStringAsEmpty,
                // 将Boolean类型的null转成false
                JSONWriter.Feature.WriteNullBooleanAsFalse,
                // 日期格式转换
                JSONWriter.Feature.PrettyFormat,
                // 将空置输出为缺省值，Number类型的null都输出为0，String类型的null输出为""，数组和Collection类型的输出为[]
                JSONWriter.Feature.NullAsDefaultValue);
        // 自定义过滤器
        // fastJsonConfig.setWriterFilters(sensitiveInfoSerializer);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        // 响应类型设置
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
        return fastJsonHttpMessageConverter;
    }
}
